/*
 * @lc app=leetcode.cn id=100 lang=typescript
 *
 * [100] 相同的树
 *
 * https://leetcode.cn/problems/same-tree/description/
 *
 * algorithms
 * Easy (60.02%)
 * Likes:    1047
 * Dislikes: 0
 * Total Accepted:    474.2K
 * Total Submissions: 789.9K
 * Testcase Example:  '[1,2,3]\n[1,2,3]'
 *
 * 给你两棵二叉树的根节点 p 和 q ，编写一个函数来检验这两棵树是否相同。
 * 
 * 如果两个树在结构上相同，并且节点具有相同的值，则认为它们是相同的。
 * 
 * 
 * 
 * 示例 1：
 * 
 * 
 * 输入：p = [1,2,3], q = [1,2,3]
 * 输出：true
 * 
 * 
 * 示例 2：
 * 
 * 
 * 输入：p = [1,2], q = [1,null,2]
 * 输出：false
 * 
 * 
 * 示例 3：
 * 
 * 
 * 输入：p = [1,2,1], q = [1,1,2]
 * 输出：false
 * 
 * 
 * 
 * 
 * 提示：
 * 
 * 
 * 两棵树上的节点数目都在范围 [0, 100] 内
 * -10^4 
 * 
 * 
 */

// @lc code=start
/**
 * Definition for a binary tree node.
*class TreeNode {
*    val: number
*    left: TreeNode | null
*    right: TreeNode | null
*    constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
*        this.val = (val === undefined ? 0 : val)
*        this.left = (left === undefined ? null : left)
*        this.right = (right === undefined ? null : right)
*    }
*}
*/

function isSameTree(p: TreeNode | null, q: TreeNode | null) {
    if(!p&&!q)return true
    else if(p==null||q==null) return false
    let stack1=new Array(p)
    let stack2=new Array(q)
    while (stack1.length > 0&&stack2.length>0) {
        const p1 = stack1.pop()
        const q1 = stack2.pop()
        if(p1.val!=q1.val)return false;// 先访问根节点
    
        // 由于栈是后进先出的，先将右子树入栈，再将左子树入栈，这样左子树会先出栈，保证先序遍历的顺序
        if (p1.right&&q1.right) {
          stack1.push(p1.right);
          stack2.push(q1.right);
        }else if(p1.right&&!q1.right||!p1.right&&q1.right){
            return false
        }
        if (p1.left&&q1.left) {
          stack1.push(p1.left);
          stack2.push(q1.left);
        }else if(p1.left&&!q1.left||!p1.left&&q1.left){
            return false
        }
      }
    return true;
};
// @lc code=end

